//路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问)
import router from '@/router'
//@ts-ignore
import nprogress from 'nprogress'
import setting from './setting'
//引入进度条样式
import 'nprogress/nprogress.css'
//获取用户相关的小仓库内部token数据,去判断用户是否登录成功
import {useUserStore} from './store/modules/user'
import  pinia  from './store'	//这里不是在组件里使用pinia的话就要重新引入一遍 pinia

//全局守卫:项目当中任意路由切换都会触发的钩子
//全局前置守卫
router.beforeEach(async (to: any, from: any, next: any) => {
    document.title =   `${setting.title} - ${to.meta.title}`
    //to:你将要访问那个路由
    //from:你从来个路由而来
    //next:路由的放行函数
    nprogress.start()
    const userStore =  useUserStore(pinia)
     //获取token,去判断用户登录、还是未登录
    // const token = userStore.token
    //获取用户名字
    // const username = userStore.username
    //用户登录判断
    if(localStorage.getItem('token')) {
        //登录成功,访问login也就是 / ,但是不能不能访问, 指向首页    layout
        if (to.path == '/') {
            next({ path: '/layout' })
        } else {
            //登录成功访问其余六个路由(登录排除)
            //有用户信息
            if(localStorage.getItem('username')) {
                //放行
                next()
            } else {
                 //如果没有用户信息,在守卫这里发请求获取到了用户信息再放行
                 try {
                    await userStore.userInfo()
                    //放行
                    //万一:刷新的时候是异步路由,有可能获取到用户信息、异步路由还没有加载完毕,出现空白的效果
                    next() 
                 } catch (error) {
                    //token过期:获取不到用户信息了
                    //用户手动修改本地存储token
                    //退出登录->用户相关的数据清空
                    await userStore.userLogout()
                    next({ path: '/', query: { redirect: to.path } })
                 }
            }
        }
    } else {
    //用户未登录判断 通过地址栏输入要去的页面，但是没登录去不了 redirect: to.path 这是自定义传递要去的参数
        if (to.path == '/') {
          next()
        } else {    //, query: { redirect: to.path } 这一块不应该带上去
            next({ path: '/' })
          }
      }
})

//全局后置守卫
router.afterEach((to: any, from: any, next: any) => {
    nprogress.done()
})


//第一个问题:任意路由切换实现进度条业务 ---nprogress
//第二个问题:路由鉴权(路由组件访问权限的设置)
//全部路由组件:登录|404|任意路由|首页|数据大屏|权限管理(三个子路由)|商品管理(四个子路由)

//用户未登录:可以访问login,其余六个路由不能访问(指向login)
//用户登录成功:不可以访问login[指向首页],其余的路由可以访问